iT邦幫忙

第 11 屆 iThome 鐵人賽

DAY 9
1

前言:在 iOS 傳值到底該使用 Closure 或者 delegate 呢?就讓我們一起來討論吧





以上可以達成我們想要的功能,也沒什麼問題,那為什麼我們還需要 Closure?


Functions are first class citizens in Swift.



我們可以擁有一個是 function 的 property.




So why are callbacks better?


  1. Decoupling. (解藕)

  • 不用管 NetworkService 的 delegate 到底是誰.

  • 也不用管到底是哪個 protocol.

  • 使用原本的 delegate 方式,"必須"實現裡面所有的 method. (Because no optional protocol.)

  1. 避免多個 delegates.

如果你想要請求完成後通知 ViewController

  • 你可能需要多個 delegates,甚至需要多個 protocol.

  • 可能會提高 retain cycles 的風險.

END


上一篇
如果今天按鈕點不到怎麼辦?
下一篇
有了 Google Map 我將不在迷路
系列文
iOS 開發:燃燒吧! 從初心者到超級初心者的轉職之旅30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

1 則留言

0
陳董粉絲
iT邦新手 5 級 ‧ 2019-10-17 16:29:49
  • 可能會提高 retain cycles 的風險
    ==>我沒看錯的話 你的myviewcontroller跟networkservice 應該retain cycle了...

其實protocol本來用意就要求代理者必須實作相關功能 試想你今天寫了一個networkservice 給別人用 他怎麼會知道init完還要實作你的onCompleted才能正常work 又或者還有多少個需要實作的func 並沒有任何提示
但是你用protocol代理就被強制要求實做 這樣的方式相對安全

不好14現在才發現你有留言,混在其他訊息中了 Orz

我沒看錯的話 你的myviewcontroller跟networkservice 應該retain cycle了...
=> 對,你說得對,那邊我疏忽沒補上[weak self],原本程式碼的確會 retain cycle ,感謝您~
其實protocol本來用意就要求代理者必須實作相關功能...(省略) => 這個我反而覺得就是問題所在,如果今天是使用 @objc protocols 而不是 Swift 的 protocol 的話,它必須實現 protocol 裡面所有的 method ,且在 networkservice 的情況,他其實不需要知道誰去實現這些方法,他只要知道何時需要去調用即可~

我要留言

立即登入留言